package game;

import java.util.*;

/**
 * Classe du plateau de jeu
 */
public class Plateau implements Structure {
	protected ArrayList<Cellule> jeu = new ArrayList<Cellule>();
	protected ArrayList<Integer> vie = new ArrayList<Integer>();
	protected ArrayList<Integer> mort = new ArrayList<Integer>();

	public Plateau(ArrayList<Cellule> a, ArrayList<Integer> b,
			ArrayList<Integer> c) {
		ArrayList<Cellule> liste = new ArrayList<Cellule>();
		int i;
		liste.add(a.get(0));
		for (i = 1; i < a.size(); i++) {
			liste.add(a.get(i));
		}
		jeu = liste;
		vie = b;
		mort = c;
	}

	public Plateau() {
		jeu = new ArrayList<Cellule>();
		vie = new ArrayList<Integer>();
		mort = new ArrayList<Integer>();
	}

	/**
	 * Permet d'ajouter un nombre permettant au cellule de rester en vie
	 * 
	 * @param x
	 *            : correspond au nombre de voisin qui permet a la cellule de
	 *            rester en vie
	 */
	public void ajout_vie(int x) {
		vie.add(x);
	}

	/**
	 * Permet d'ajouter un nombre definissant les regles de mort des cellules
	 * 
	 * @param x
	 *            : correspond au nombre de voisin qui font mourrir une cellule
	 */
	public void ajout_mort(int x) {
		mort.add(x);
	}

	/**
	 * Regles de vie et de mort de base
	 */
	public void regles_normales() {
		vie.add(3);
		vie.add(2);
		mort.add(3);
	}

	public ArrayList<Integer> getVie() {
		return vie;
	}

	public void setVie(ArrayList<Integer> vie) {
		this.vie = vie;
	}

	public ArrayList<Integer> getMort() {
		return mort;
	}

	public void setMort(ArrayList<Integer> mort) {
		this.mort = mort;
	}

	public ArrayList<Cellule> getJeu() {
		return jeu;
	}

	public void setJeu(ArrayList<Cellule> jeu) {
		this.jeu = jeu;
	}

	/**
	 * Ajoute une cellule dans la liste de cellule du jeu
	 * 
	 * @param x
	 *            : abscisse de la cellule
	 * @param y
	 *            : ordonnee de la cellule
	 */
	public void ajout(int x, int y) {
		Cellule c = new Cellule(x, y);
		if (jeu.contains(c)) {
			System.out.println("case deja rempli !!");
		} else {
			jeu.add(c);
			Collections.sort(jeu, Collections.reverseOrder());
		}
	}

	/**
	 * Compare deux listes de celllules
	 * 
	 * @param l
	 *            : premiere liste
	 * @param l2
	 *            : deuxieme liste
	 * @return true si les deux listes contiennent les memes cellules, false
	 *         sinon
	 */
	static public boolean compareList(ArrayList<Cellule> l,
			ArrayList<Cellule> l2) {
		if (l2.size() != l.size()) {
			return false;
		}
		int comparaisonX = l2.get(0).posX - l.get(0).posX;
		int comparaisonY = l2.get(0).posY - l.get(0).posY;

		for (int i = 1; i < l2.size(); i++) {
			if ((l2.get(i).posX - l.get(i).posX) != comparaisonX) {
				return false;
			} else if ((l2.get(i).posY - l.get(i).posY) != comparaisonY) {
				return false;
			}
		}
		return true;
	}

	/**
	 * Compare deux listes de celllules
	 * 
	 * @param l
	 *            : premiere liste
	 * @param l2
	 *            : deuxieme liste
	 * @return true si les deux listes contiennent les memes cellules, false
	 *         sinon
	 */
	static public boolean compareList2(ArrayList<Cellule> l,
			ArrayList<Cellule> l2) {
		if (l2.size() != l.size()) {
			return false;
		}
		System.out.println(l2.size());
		for (int i = 0; i < l2.size(); i++) {
			if (l2.get(i).compareTo(l.get(i)) != 0)
				return false;
		}
		return true;
	}

	/**
	 * Calcule la hauteur du plateau de jeu
	 * 
	 * @return la hauteur du plateau
	 */
	public int getHauteur() {
		int minY = jeu.get(0).posY;
		int maxY = jeu.get(0).posY;
		for (int i = 0; i < jeu.size(); i++) {
			if (jeu.get(i).posY < minY) {
				minY = jeu.get(i).posY;
			}
			if (jeu.get(i).posY > maxY) {
				maxY = jeu.get(i).posY;
			}
		}
		return (maxY - minY) + 1;
	}

	/**
	 * Calcule la largeur du plateau
	 * 
	 * @return la largeur du plateau
	 */
	public int getLargeur() {
		int minX = jeu.get(0).posX;
		int maxX = jeu.get(0).posX;
		for (int i = 0; i < jeu.size(); i++) {
			if (jeu.get(i).posX < minX) {
				minX = jeu.get(i).posX;
			}
			if (jeu.get(i).posX > maxX) {
				maxX = jeu.get(i).posX;
			}
		}
		return (maxX - minX) + 1;
	}

	/**
	 * Affiche les cellules d'un plateau de jeu
	 * 
	 * @param taille
	 *            : hauteur du plateau
	 * @param largeur
	 *            : largeur du plateau
	 */
	public String affichage(int taille, int largeur) {
		if (jeu.isEmpty()) {
			System.out.println("MORT");
			return "";
		} else {
			String s = "";
			int minX = jeu.get(0).posX;
			int minY = jeu.get(0).posY;
			int maxX = jeu.get(0).posX;
			int maxY = jeu.get(0).posY;
			int hauteur = 1;
			int lon = 1;
			for (int i = 0; i < jeu.size(); i++) {
				if (jeu.get(i).posX < minX) {
					minX = jeu.get(i).posX;
				}
				if (jeu.get(i).posY < minY) {
					minY = jeu.get(i).posY;
				}
				if (jeu.get(i).posX > maxX) {
					maxX = jeu.get(i).posX;
				}
				if (jeu.get(i).posY > maxY) {
					maxY = jeu.get(i).posY;
				}
			}
			for (int i = maxY; i >= minY; i--) {
				lon = 0;
				for (int j = minX; j <= maxX; j++) {
					Cellule cf = new Cellule(j, i);
					if (jeu.contains(cf)) {
						s += "*";
						lon++;
					} else {
						s += " ";
						lon++;
					}
				}
				if (lon < largeur) {
					for (int k = 0; k < (largeur - lon) + 1; k++) {
						s += " ";
					}
				}
				s += "\n";
				hauteur++;
			}
			if (hauteur < taille) {
				for (int i = 0; i < (taille - hauteur) + 1; i++) {
					for (int k = 0; k < largeur; k++) {
						s += " ";
					}
					s += "\n";
				}
			}
			return s;
		}
	}
}
